package com.game.desktop.Maze.Tests;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

import com.game.Maze.Objects.Maze;
import com.game.Maze.Objects.MazeException;
import com.game.Maze.Objects.Room;
import com.game.Maze.Util.WorldSide;

public class TestMaze
{
  private static final int m_MazeSize = 10;
  private static Maze m_Maze;

  @Before
  public void setUp() throws MazeException
  {
    m_Maze = new Maze(m_MazeSize);
  }
  
  /**
   * Тестируем создание лабиринта
   */
  @Test
  public void TestCreateMaze()
  {
    // Проверяем, что лабиринт создан
    assertNotNull("Лабиринт не создан", m_Maze);
    
    // Проверяем, что созданный лабиринт возвращает заданный размер
    assertTrue("Размер лабиринта не соответствует заданному", m_MazeSize == m_Maze.size());    
  }
  
  /**
   * Тестируем получение всех комнат лабиринта
   */
  @Test
  public void TestGetRooms()
  {
    // Получаем все комнаты внутри лабиринта
    Room room;
    
    for (int column = 0; column < m_MazeSize; column++)
      for (int row = 0; row < m_MazeSize; row++)
      {
        room = m_Maze.room(column, row);
        assertNotNull(String.format("Не получили комнату %d, %d", column, row), room);
      }
  }
  
  /**
   * Тестируем, что все комнаты в пустом лабиринте имеют 4 стены
   * @throws MazeException 
   */
  @Test
  public void TestGetRoomsWalls() throws MazeException
  {
    final String errorMsg = "У комнаты %d, %d нет стены на %s"; 
    // Получаем все комнаты внутри лабиринта
    Room room;
    
    for (int column = 0; column < m_MazeSize; column++)
      for (int row = 0; row < m_MazeSize; row++)
      {
        room = m_Maze.room(column, row);
        assertTrue(String.format(errorMsg, column, row, WorldSide.North.toString()), room.passageBySide(WorldSide.North).isWall());
        assertTrue(String.format(errorMsg, column, row, WorldSide.South.toString()), room.passageBySide(WorldSide.South).isWall());
        assertTrue(String.format(errorMsg, column, row, WorldSide.East.toString()), room.passageBySide(WorldSide.East).isWall());
        assertTrue(String.format(errorMsg, column, row, WorldSide.West.toString()), room.passageBySide(WorldSide.West).isWall());
      }
  }
  
  /**
   * Тестируем рендер комнаты
   * @throws MazeException 
   */
  @Test
  public void TestRoomRender() throws MazeException
  {
    final String errorMsg = "У комнаты %d, %d нет стены на %s"; 
    // Получаем все комнаты внутри лабиринта
    Room room;
    
    for (int column = 0; column < m_MazeSize; column++)
      for (int row = 0; row < m_MazeSize; row++)
      {
        room = m_Maze.room(column, row);
        assertTrue(String.format(errorMsg, column, row, WorldSide.North.toString()), room.passageBySide(WorldSide.North).isWall());
        assertTrue(String.format(errorMsg, column, row, WorldSide.South.toString()), room.passageBySide(WorldSide.South).isWall());
        assertTrue(String.format(errorMsg, column, row, WorldSide.East.toString()), room.passageBySide(WorldSide.East).isWall());
        assertTrue(String.format(errorMsg, column, row, WorldSide.West.toString()), room.passageBySide(WorldSide.West).isWall());
      }
  }  
  
}
